package com.material.common.utils;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;


/**
 * Json工具类
 *
 * @author
 */
public class JsonUtils {

    /**
     * fastjson类处理 - json字符串格式化输出
     * @param jsonString
     * @return
     */
    public static String jsonFormatter(String jsonString) {
        JSONObject object = JSONObject.parseObject(jsonString);
        String pretty = JSON.toJSONString(
                object,
                JSONWriter.Feature.PrettyFormat,
                JSONWriter.Feature.WriteMapNullValue
        );
        return pretty;
    }

    /**
     * fastjson类处理 - json转List
     * @return
     */
    public static <T> List<T> array2List(String jsonArrayString, Class<T> type) {
        if (StringUtils.isBlank(jsonArrayString)) {
            return null;
        }
        return JSONArray.parseArray(jsonArrayString, type);
    }

    public static JSONArray json2Array(String json) {
        return JSON.parseArray(json);
    }

    /**
     * fastjson类处理 - json字符串转成Json Object对象
     * @param json
     * @param json
     * @return
     */
    public static JSONObject json2Object(String json) {
        //return JSONObject.parseObject(json, Feature.OrderedField);
        return JSON.parseObject(json);
    }

    /**
     * fastjson类处理 - json字符串转成Json Object对象
     * @param json
     * @param sort
     * @return
     */
    public static JSONObject json2Object(String json, boolean sort) {
        if (!sort) {
            json2Object(json);
        }
        return JSONObject.parseObject(json);
    }

    /**
     * fastjson类处理 - json字符串转成Object对象
     * @param json
     * @param clazz
     * @return
     */
    public static <T> T json2Object(String json, Class<T> clazz) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        //return JSON.parseObject(json, new TypeReference<T>(clazz) {});
        // 使用 JSON.parseObject 解析 JSON 字符串为 JSONObject
        JSONObject jsonObject = JSON.parseObject(json);

        // 使用 JSON.to 将 JSONObject 转换为目标类型的对象
        T result = JSON.to(clazz, jsonObject);
        return result;
    }

    /**
     * fastjson类处理 - json转成Object对象，并class中忽略不存在的属性
     * @param json
     * @param clazz
     * @return
     */
    public static <T> T json2ObjectIgnored(String json, Class<T> clazz) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        return JSON.parseObject(json, clazz);
    }

    public static SortedMap<String, Object> toObjectSortedMap(String jsonData) {
        JSONObject jsonObject = JSONObject.parseObject(jsonData);
        SortedMap<String, Object> result = new TreeMap<String, Object>();
        String key = null;
        Object value = null;
        for (String k : jsonObject.keySet()){
            key = k;
            value = jsonObject.get(k);
            result.put(key,value);
        }
        return result;
    }

    /**
     * fastjson类处理 - object转json字符串
     * @param obj
     * @return
     */
    public static String object2Json(Object obj){
        return JSON.toJSONString(obj);
    }

    /*******************************以下方法是jackson处理json*************************************/

    /**
     * jackson处理json
     * java对象转json字符串
     *
     * @param obj
     */
    public static String obj2Json(Object obj) {
        return obj2Json(obj, 0);
    }

    /**
     * jackson处理json
     * @param obj
     * @return
     */
    public static JSONObject obj2JsonObject(Object obj) {
        return json2Object(obj2Json(obj, 2));
    }

    /**
     * jackson处理json
     * java对象转json字符串
     *
     * @param obj
     * @param mode 转换模式（0-全部属性，1-非空属性，2-非空串属性）
     */
    public static String obj2Json(Object obj, int mode) {
        if (obj == null) {
            return null;
        }
        ObjectMapper objectMapper = new ObjectMapper();
        switch (mode) {
            case 0:
                objectMapper.setSerializationInclusion(Inclusion.ALWAYS);
                break;
            case 1:
                objectMapper.setSerializationInclusion(Inclusion.NON_NULL);
                break;
            case 2:
                objectMapper.setSerializationInclusion(Inclusion.NON_EMPTY);
                break;
            default:
                objectMapper.setSerializationInclusion(Inclusion.ALWAYS);
                break;
        }
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        String json = null;
        try {
            json = objectMapper.writeValueAsString(obj);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return json;
    }

}
